package com.skyd.core.game.td;


import java.util.concurrent.CopyOnWriteArrayList;


import com.skyd.core.common.Point;
import com.skyd.core.vector.Vector2DF;
import com.skyd.core.vector.VectorRect2DF;

public class TDMapPiece extends TDEntity implements ITDMapPiece {
	
	public TDMapPiece(Point p){
		_IndexLocation=p;
		setPosition(new Vector2DF(p.x*TDWorld.getInstance().getMap().getPieceStandardSize().getX(), p.y*TDWorld.getInstance().getMap().getPieceStandardSize().getY()));
	}

	/**
	 * 最后一次检查表面的时间
	 */
	private long lastCheckSurfaceTime = Long.MIN_VALUE;
	/**
	 * 检查表面间隔时间
	 */
	private int checkSurfaceDelay = 10;
	/**
	 * 地图表面的演员
	 */
	private CopyOnWriteArrayList<ITDActor> surfaceActorList;

	@Override
	public void update() {
		if (_SurfaceChangeListenerList != null) {
			if (getCurrentTime() - lastCheckSurfaceTime > checkSurfaceDelay) {
				CopyOnWriteArrayList<ITDActor> a = getSurfaceActors();
				if (surfaceActorList != null) {
					for (ITDActor f : a) {
						if (!surfaceActorList.contains(f))
							OnSurfaceChange(f, true);
					}
					for (ITDActor f : surfaceActorList) {
						if (!a.contains(f))
							OnSurfaceChange(f, false);
					}
				}
				surfaceActorList = a;
				lastCheckSurfaceTime = getCurrentTime();
			}
		}
	}

	/**
	 * 初始值为false。 功能注释：是否允许建造
	 */
	private boolean _IsAllowBuild = false;

	/**
	 * 获取IsAllowBuild。 功能注释：是否允许建造
	 * 
	 * @return 当前的boolean类型的值
	 */
	public boolean getIsAllowBuild() {
		return _IsAllowBuild;
	}

	/**
	 * 设置IsAllowBuild。 功能注释：是否允许建造
	 * 
	 * @param value
	 *            要设置的boolean类型值
	 */
	public void setIsAllowBuild(boolean value) {
		_IsAllowBuild = value;
	}

	/**
	 * 设置IsAllowBuild为其默认值(false)。 功能注释：是否允许建造
	 */
	public void setIsAllowBuildToDefault() {
		setIsAllowBuild(false);
	}

	/**
	 * 初始值为false。 功能注释：是否允许通过
	 */
	private boolean _IsAllowPass = false;

	/**
	 * 获取IsAllowPass。 功能注释：是否允许通过
	 * 
	 * @return 当前的boolean类型的值
	 */
	public boolean getIsAllowPass() {
		return _IsAllowPass&&(!getIsAllowBuild()||getSurfaceTowers().size()==0);
	}

	/**
	 * 设置IsAllowPass。 功能注释：是否允许通过
	 * 
	 * @param value
	 *            要设置的boolean类型值
	 */
	public void setIsAllowPass(boolean value) {
		_IsAllowPass = value;
	}

	/**
	 * 设置IsAllowPass为其默认值(false)。 功能注释：是否允许通过
	 */
	public void setIsAllowPassToDefault() {
		setIsAllowPass(false);
	}

	@Override
	public Vector2DF getSize() {
		return TDWorld.getInstance().getMap().getPieceStandardSize();
	}
	
//	@Override
//	public Vector2DF getPosition() {
//		return new Vector2DF(this.getIndexLocation().x*getSize().getX(), this.getIndexLocation().y*getSize().getY());
//	}

	@Override
	public CopyOnWriteArrayList<ITDTower> getSurfaceTowers() {
		CopyOnWriteArrayList<ITDTower> a = new CopyOnWriteArrayList<ITDTower>();
		VectorRect2DF r = getAreaRect();
		for (ITDTower f : TDWorld.getInstance().getTowers()) {
			if (calculationsIsInArea(f, r))
				a.add(f);
		}
		return a;
	}

	@Override
	public CopyOnWriteArrayList<ITDBiont> getSurfaceBiont() {
		CopyOnWriteArrayList<ITDBiont> a = new CopyOnWriteArrayList<ITDBiont>();
		VectorRect2DF r = getAreaRect();
		for (ITDBiont f : TDWorld.getInstance().getBiont()) {
			if (calculationsIsInArea(f, r))
				a.add(f);
		}
		return a;
	}

	@Override
	public CopyOnWriteArrayList<ITDActor> getSurfaceActors() {
		CopyOnWriteArrayList<ITDActor> a = new CopyOnWriteArrayList<ITDActor>();
		VectorRect2DF r = getAreaRect();
		for (ITDActor f : TDWorld.getInstance().getActors()) {
			if (calculationsIsInArea(f, r))
				a.add(f);
		}
		return a;
	}

	/**
	 * 地图表面情况改变事件监听器列表
	 */
	private CopyOnWriteArrayList<ITDMapPieceSurfaceChangeListener> _SurfaceChangeListenerList = null;

	@Override
	public void addOnSurfaceChangeListener(
			ITDMapPieceSurfaceChangeListener listener) {
		if (_SurfaceChangeListenerList == null)
			_SurfaceChangeListenerList = new CopyOnWriteArrayList<ITDMapPieceSurfaceChangeListener>();
		if (!_SurfaceChangeListenerList.contains(listener))
			_SurfaceChangeListenerList.add(listener);
	}

	/**
	 * 移除地图表面情况改变监听器
	 * 
	 * @param listener
	 *            监听器
	 */
	public void removeOnSurfaceChangeListener(
			ITDMapPieceSurfaceChangeListener listener) {
		if (_SurfaceChangeListenerList == null)
			return;
		if (_SurfaceChangeListenerList.contains(listener))
			_SurfaceChangeListenerList.remove(listener);
		if (_SurfaceChangeListenerList.size() == 0) {
			_SurfaceChangeListenerList = null;
			surfaceActorList = null;
		}
	}

	/**
	 * 发生地图表面情况改变事件时
	 * 
	 * @param actor
	 *            涉及演员
	 * @param into
	 *            是代表进入，否代表退出
	 */
	protected void OnSurfaceChange(ITDActor actor, boolean into) {
		if (_SurfaceChangeListenerList == null)
			return;
		for (ITDMapPieceSurfaceChangeListener f : _SurfaceChangeListenerList) {
			f.onMapSurfaceChange(this, actor, into);
		}
	}

	@Override
	public boolean putTower(ITDTower t) {
		if(!getIsAllowBuild())return false;
		CopyOnWriteArrayList<ITDTower> a = getSurfaceTowers();
		if (a == null || a.size() == 0) {
			t.setPosition(getCenterPosion());
			TDWorld.getInstance().getTowers().add(t);
			return true;
		}
		return false;
	}

	/**
	 * 初始值为null。 功能注释：在地图中的索引位置
	 */
	private Point _IndexLocation = null;

	/**
	 * 获取IndexLocation。 功能注释：在地图中的索引位置
	 * 
	 * @return 当前的Point类型的值
	 */
	public Point getIndexLocation() {
		return _IndexLocation;
	}

	/**
	 * 设置IndexLocation。 功能注释：在地图中的索引位置
	 * 
	 * @param value
	 *            要设置的Point类型值
	 */
	public void setIndexLocation(Point value) {
		_IndexLocation = value;
	}

	/**
	 * 设置IndexLocation为其默认值(null)。 功能注释：在地图中的索引位置
	 */
	public void setIndexLocationToDefault() {
		setIndexLocation(null);
	}
	
	/**
	 * 规划到目标地图块的路线
	 * @param target 目标
	 * @param containSelfPosion 包含自身的坐标
	 * @ignoreHinder 忽略障碍
	 * @return 行进路线
	 */
	public CopyOnWriteArrayList<Vector2DF> planningRoute(ITDMapPiece target,boolean containSelfPosion,boolean ignoreHinder){
		return TDMap.planningRoute(this, target, containSelfPosion,ignoreHinder);
	}

}
